package com.gem.day14;

import java.io.*;
import java.util.List;

import lombok.*;

/**
 * 本类用来演示Java操作对象类型的IO流
 * ObjectInputStream
 * ObjectOutputStream
 * 
 * 注意:这两个流都是拓展类,过滤流,不具备真正读写能力,所以要组合使用
 * 
 * @author easonsy
 * 2020年8月6日 上午10:34:44
 */
public class ObjectInputStreamDemo {
	public static void main(String[] args) {
		/*List<Role> roles = new ArrayList<>();
		Role r1 = new Role("克劳德", 60);
		Role r2 = new Role("蒂法", 55);
		Role r3 = new Role("爱丽丝", 65);
		roles.add(r1);
		roles.add(r2);
		roles.add(r3);
		save("D:\\Final Fantasy 7\\save\\data.sav", roles);*/

		load("D:\\Final Fantasy 7\\save\\data.sav").forEach(System.out::println);
	}

	/**
	 * 存档
	 */
	public static void save(String savePath, List<Role> roles) {
		try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(savePath))) {
			/*
			 * 注意:
			 * 要把对象写入到本地文件中[对象序列化],必须让被序列化的对象实现序列化接口,java.io.Serializable,标记接口
			 * 如果没有实现,则抛出:java.io.NotSerializableException
			 */
			oos.writeObject(roles);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 读档
	 */
	public static List<Role> load(String savePath) {
		List<Role> roles = null;
		try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(savePath))) {
			roles = (List<Role>) ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return roles;
	}
}

/**角色实体类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
class Role implements Serializable {
	/*
	 * 注意:
	 * 实现序列化接口后最好要提供serialVersionUID,序列化标识,
	 * 该标识产生一个串码,该串码可以在反序列化时,确保序列化和反序列化的对象
	 * 是同一个对象
	 */
	private static final long serialVersionUID = 8037999082824374837L;

	private String name;
	//如果想要某个或者多个属性在序列化时不被写入文件,则可以提供关键字:transient
	//transient作用是忽略被修饰属性的序列化行为
	private transient Integer level;
}
